<?php

/**
 * 继承system/Helpers的array辅助函数
 */
function any_in_array($needle, $haystack)
{
    $needle = is_array($needle) ? $needle : [
        $needle
    ];
    
    foreach ($needle as $item) {
        if (in_array($item, $haystack)) {
            return TRUE;
        }
    }
    
    return FALSE;
}

// random_element() 在数组辅助函数中被定义了，所以在这里重载了原生的函数
function random_element($array)
{
    shuffle($array);
    return array_pop($array);
}

/**
 * 从指定的key获取数组中的值，key可用点号连接
 *
 * @param $array
 * @param $key
 * @param null $default
 * @return mixed
 */
function array_fetch($array, $key, $default = NULL)
{
    if (is_null($key)) {
        return $array;
    }
    foreach (explode('.', $key) as $segment) {
        if (is_array($array)) {
            if (! array_key_exists($segment, $array)) {
                return $default;
            }
            $array = $array[$segment];
        } elseif ($array instanceof ArrayAccess) {
            if (! isset($array[$segment])) {
                return $default;
            }
            $array = $array[$segment];
        } elseif (is_object($array)) {
            if (! isset($array->{$segment})) {
                return $default;
            }
            $array = $array->{$segment};
        } else {
            return $default;
        }
    }
    return $array;
}

/**
 * 根据指定的字段，从原数组中，生成一个新的数组
 *
 * @param $array
 * @param $value
 * @param null $key
 * @return array
 */
function array_pluck($array, $value, $key = null)
{
    $results = array();
    foreach ($array as $item) {
        $itemValue = array_fetch($item, $value);
        
        if (is_null($key)) {
            $results[] = $itemValue;
        } else {
            $itemKey = array_fetch($item, $key);
            $results[$itemKey] = $itemValue;
        }
    }
    return $results;
}

/**
 * 重新格式化数组
 *
 * @param array $arr
 * @param string $field 以指定的字段名为新数据的key
 * @return array
 */
function reform_arr($arr = array(array('id'=>1, 'other'=>''),), $field = 'id')
{
    $new_arr = array();
    if (! is_array($arr)) {
        return $new_arr;
    }
    foreach ($arr as $av) {
        if (! is_array($av)) {
            break;
        }
        $fields = explode('.', $field);
        $tmp = $av;
        foreach ($fields as $f) {
            if (! array_key_exists($f, $tmp)) {
                break;
            }
            $tmp = $tmp[$f];
        }
        if (! isset($new_arr[$tmp])) {
            $new_arr[(string) $tmp] = $av;
        }
    }
    return $new_arr;
}

/**
 * 多维数组去重
 */
function array_multiunique($array)
{
    $return = array();
    foreach ($array as $key => $v) {
        if (! in_array($v, $return)) {
            $return[$key] = $v;
        }
    }
    return $return;
}

/**
 * 为二维数组的每个子数组添加一个元素
 *
 * @param array $arr
 * @param strimg $key
 * @param mixed $value
 * @return array
 */
function array_push_element($arr, $key, $value)
{
    foreach ($arr as $k => $v) {
        $arr[$k][$key] = $value;
    }
    return $arr;
}

/**
 * 对数组进行转码
 *
 * @author jois
 */
function array_iconv($in_charset, $out_charset, $arr)
{
    return eval('return ' . iconv($in_charset, $out_charset, var_export($arr, true) . ';'));
}
